home *** CD-ROM | disk | FTP | other *** search
- 5 CLOSE #2: OPEN "lpt1:" FOR OUTPUT AS #2
- 10 CLS:PRINT#2,"Program ALC.BAS - average linkage clustering"
- 20 ' a heirachical classification for N individuals.
- 30 ' input data - the upper half of an N*N similarity matrix
- 40 ' that is R-squares. Excludes the diagonal. Starts row 1, col.2-n
- 45 ' VERSION 3/83 - compiled for HARD DISK D. Wang cybersoft group
- 50 '
- 60 PRINT#2,"====================================================":PRINT#2,
- 65 '
- 70 INPUT"Enter input matrix name (try C:corrmat.dat)";INA$
- 80 OPEN INA$ FOR INPUT AS #1
- 90 INPUT"Enter N, number of sets to cluster (max. 40)";N
- 100 DIM S(40,40), R(40,40), N(40)
- 110 ' array symbols: S,R - NxN arrays
- 120 ' N - vector with N values
- 130 '
- 140 ' read in data
- 150 '
- 220 FOR L=1 TO N-1
- 230 FOR M=L+1 TO N
- 240 INPUT#1,A
- 250 S(L,M)=A
- 260 S(M,L)=A
- 270 NEXT M
- 280 NEXT L
- 290 FOR I=1 TO N:FOR J=1 TO N:R(I,J)=0:NEXT:N(I)=1:NEXT 'initialize matrices
- 300 FOR L=1 TO N
- 310 R(L,1)=L
- 320 NEXT L
- 330 ' find valid fusions
- 340 Q=0
- 350 FOR I=1 TO N-1
- 360 FOR J=I+1 TO N
- 370 IF S(I,J)<=Q THEN 410
- 380 Q=S(I,J)
- 390 L=I
- 400 M=J
- 410 NEXT J
- 415 NEXT I
- 420 IF Q=0 THEN 870
- 430 C=0
- 440 ' update group registers
- 450 FOR I=N(L)+1 TO N(L)+N(M)
- 460 C=C+1
- 470 R(L,I)=R(M,C)
- 480 R(M,C)=0
- 490 NEXT I
- 500 N1=N(L)
- 510 N2=N(M)
- 520 N3=N1+N2
- 540 N(L)=N(L)+N(M)
- 560 N(M)=0
- 570 ' print fusion statistics
- 600 C6=C6+1
- 610 PRINT#2,
- 620 PRINT#2," clustering pass ";C6;" number of individuals =";N(L)
- 640 PRINT#2," average similarity";Q
- 650 PRINT#2," individuals: "
- 660 FOR J=1 TO N
- 670 IF R(L,J)=0 THEN 700
- 680 PRINT#2," ";R(L,J);
- 690 NEXT J
- 700 PRINT#2,
- 720 ' compute average similarities
- 730 FOR J=1 TO N
- 740 IF S(L,J)=-1000 THEN 810
- 750 IF M=J THEN 810
- 755 IF J=L THEN 810
- 760 A=(N1/N3)*S(L,J)
- 770 B=(N2/N3)*S(M,J)
- 780 D=((N1*N2)/(N3*N3))*(1-S(L,M))
- 790 S(L,J)=A+B+D
- 800 S(J,L)=A+B+D
- 810 NEXT J
- 820 FOR J=1 TO N
- 830 S(M,J)=-1000
- 840 S(J,M)=-1000
- 850 NEXT J
- 860 GOTO 330
- 870 END
- 800 S(J,L)=A+B+D
- 810 NEXT J
- 820 FOR J=1 TO N
- 830 S(M,J)=-1000
- 840 S(J,M)=-1000
-